#ifndef TF
#define TF

/**
 * \file table_fichiers.h
 * \brief Include pour le fichier table_fichiers.c
 *
 * Ce fichier contient la définition des structures utilisées dans
 * tables_fichiers.c ainsi que les prototypes des fonctions 
 * dont on a besoin pour accéder/modifier la table.
 *
 */
 
/****************  Includes  ****************/

#include "md5/md5.h"
#include "include.h"

/****************************  Macros  ****************************/

#define PORTMIN 20000 /*!< Numéro de port minimal pour le transfert*/
#define PORTMAX 30000 /*!< Numéro de port maximal pour le transfert */
#define TAILLE_MD5 16 /*!< Taille de la clé MD5 */
#define NB_FICHIERS 2048 /*!< Nombre de fichiers dans la table de fichiers */



/**
 * \struct EntreeTable
 * \brief Structure "fichier" soit une entrée de la table des fichiers.
 *
 * EntreeTable représente un fichier, soit un entrée de la table, avec
 * son nom, sa taile, la clé qui lui a été attribuée, et le numéro de port
 * de téléchargement.
 *
 */

/****************************  Structures  ****************************/

typedef struct EntreeTable{

  char * nom_fichier;/*!< Nom du fichier */ 
  long taille; /*!< Taille du fichier */
  char clef [TAILLE_MD5*2+1];  /*!< Clé MD5 attribuée au fichier */
  char * ip; //   /*!< Adresse IP du propriétaire */
  int port;  /*!< Port de téléchargement */

}EntreeTable;


/**
 * \struct TableFichiers
 * \brief La table des fichiers.
 *
 * Cette structure constitue une table de fichiers, elle contient donc
 * des EntreeTable (un tableau avec un nombre de fichiers prédéfini)
 * plus un indicateur de fin de la table.
 *
 */
typedef struct TableFichiers{

  EntreeTable contenu[NB_FICHIERS]; /*!< Contenu de la table - tableau de EntreeTables */
  int fin_table;  /*!< Indice de fin de la table */

}TableFichiers;



/*******************  Static function prototypes *******************/


/**
 * \brief Initiation d'une table de fichiers.
 *
 * \return TableFichiers initialisée.
 */

TableFichiers init_table();

/**
 * \brief Fonction permettant d'attribuer un port initial au premier fichier de la liste
 *
 * Cette fonction permet de donner un port aléatoire au premier fichier passé en paramètre
 * Ils sont incrémentés de 1 après.
 *
 * \param fichier Fichier à qui donner le port
 *
 * \return le fichier avec le nouveau port
 */

int donner_port_initial (EntreeTable fichier);

/**
 * \brief Remplissage d'une table de fichiers.
 *
 * \param nom_repertoire Nom du répertoire dans lequel se trouvent les fichiers partagés
 * \param table Table de fichiers à remplir.
 *
 * \return l'entier indicateur de fin de la table une fois remplie.
 */
int remplir_table (char * nom_repertoire,TableFichiers * table);

/**
 * \brief Trouver un fichier dans la table grâce à sa clé.
 *
 * \param buffer le buffer que l'on va remplir avec le nom du fichier
 * \param table la table dans laquelle on cherche
 * \param clef la clé du fichier recherché
 * \param table Table de fichiers à remplir.
 * \return 1 si le fichier a été trouvé, -1 sinon.
 */

EntreeTable trouver_fichier(TableFichiers table, unsigned char * clef);


/**
 * \brief Trouver un fichier à partir de son nom.
 * Cette fonction cherche un fichier dans la table 
 * grâce au nom passé en paramètres.
 * \param nom_fichier Nom du fichier à trouver
 * \param table Table dans laquelle chercher
 * \return l'entrée table avec le fichier
 */

EntreeTable trouver_fichier_nom( char * nom_fichier, TableFichiers table);


/**
 * \brief Afficher la table des entrées.
 * Cette fonction de déboguage affiche les éléments contenus dans la table 
 * passée en paramètres.
 * \param table Table dans laquelle chercher
 * \return void
 */

void afficher_table(TableFichiers table);
#endif
